home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / osrc.arc / SMISC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-30  |  4.0 KB  |  206 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "proc.h"
  7. #include "remote.h"
  8.  
  9. extern FILE *Logfp;
  10. extern int errno;
  11.  
  12. char *Rempass;    /* Remote access password */
  13.  
  14. static void discserv(),echoserv();
  15. static int Rem = -1;
  16. static int Sdisc = -1;
  17. static int Secho = -1;
  18.  
  19. /* Start up TCP discard server */
  20. dis1(argc,argv)
  21. int argc;
  22. char *argv[];
  23. {
  24.     struct sockaddr_in lsocket;
  25.     int s;
  26.  
  27.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  28.     chname(Curproc,"Discard listener");
  29.  
  30.     lsocket.sin_family = AF_INET;
  31.     lsocket.sin_addr.s_addr = Ip_addr;
  32.     if(argc < 2)
  33.         lsocket.sin_port = IPPORT_DISCARD;
  34.     else
  35.         lsocket.sin_port = atoi(argv[1]);
  36.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  37.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  38.     listen(Sdisc,1);
  39.     for(;;){
  40.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  41.             break;    /* Service is shutting down */
  42.  
  43.         /* Spawn a server */
  44.         newproc("Discard server",576,discserv,s,NULL,NULL);
  45.     }
  46. }
  47. static void
  48. discserv(s,unused)
  49. int s;
  50. void *unused;
  51. {
  52.     struct mbuf *bp;
  53.  
  54.     sockowner(s,Curproc);
  55.     log(s,"open discard");
  56.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  57.         free_p(bp);
  58.     log(s,"close discard");
  59.     close_s(s);
  60. }
  61. dis0()
  62. {
  63.     if(Sdisc != -1){
  64.         close_s(Sdisc);
  65.         Sdisc = -1;
  66.     }
  67. }
  68. /* Start up TCP echo server */
  69. echo1(argc,argv)
  70. int argc;
  71. char *argv[];
  72. {
  73.     struct sockaddr_in lsocket;
  74.     int s;
  75.  
  76.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  77.     chname(Curproc,"Echo listener");
  78.  
  79.     lsocket.sin_family = AF_INET;
  80.     lsocket.sin_addr.s_addr = Ip_addr;
  81.     if(argc < 2)
  82.         lsocket.sin_port = IPPORT_ECHO;
  83.     else
  84.         lsocket.sin_port = atoi(argv[1]);
  85.     Secho = socket(AF_INET,SOCK_STREAM,0);
  86.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  87.     listen(Secho,1);
  88.     for(;;){
  89.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  90.             break;    /* Service is shutting down */
  91.  
  92.         /* Spawn a server */
  93.         newproc("Echo server",2048,echoserv,s,NULL,NULL);
  94.     }
  95. }
  96. static void
  97. echoserv(s,unused)
  98. int s;
  99. void *unused;
  100. {
  101.     struct mbuf *bp;
  102.  
  103.     sockowner(s,Curproc);
  104.     log(s,"open echo");
  105.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  106.         send_mbuf(s,bp,0,NULLCHAR,0);
  107.  
  108.     log(s,"close echo");
  109.     close_s(s);
  110. }
  111. echo0()
  112. {
  113.     if(Secho != -1){
  114.         close_s(Secho);
  115.         Secho = -1;
  116.     }
  117. }
  118. /* Start remote exit/reboot server */
  119. rem1(argc,argv)
  120. int argc;
  121. char *argv[];
  122. {
  123.     struct sockaddr_in lsocket,fsock;
  124.     int i;
  125.     char command;
  126.     struct mbuf *bp;
  127.     int32 addr;
  128.  
  129.     psignal(Curproc,0);
  130.     chname(Curproc,"Remote listener");
  131.     lsocket.sin_family = AF_INET;
  132.     lsocket.sin_addr.s_addr = Ip_addr;
  133.     if(argc < 2)
  134.         lsocket.sin_port = IPPORT_REMOTE;
  135.     else
  136.         lsocket.sin_port = atoi(argv[1]);
  137.     
  138.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  139.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  140.     for(;;){
  141.         i = sizeof(fsock);
  142.         recv_mbuf(Rem,&bp,0,0,(char *)&fsock,&i);
  143.         command = pullchar(&bp);
  144.  
  145.         switch(uchar(command)){
  146. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  147.         case SYS_RESET:
  148.             i = chkrpass(bp);
  149.             log(Rem,"%s - Remote reset %s",
  150.              psocket((struct sockaddr *)&fsock),
  151.              i == 0 ? "PASSWORD FAIL" : "" );
  152.             if(i != 0){
  153.                 iostop();
  154.                 sysreset();    /* No return */
  155.             }
  156.             break;
  157. #endif
  158.         case SYS_EXIT:
  159.             i = chkrpass(bp);
  160.             log(Rem,"%s - Remote exit %s",
  161.              psocket((struct sockaddr *)&fsock),
  162.              i == 0 ? "PASSWORD FAIL" : "" );
  163.             if(i != 0){
  164.                 iostop();
  165.                 exit(0);
  166.             }
  167.             break;
  168.         case KICK_ME:
  169.             if(len_mbuf(bp) >= sizeof(int32))
  170.                 addr = pull32(&bp);
  171.             else
  172.                 addr = fsock.sin_addr.s_addr;
  173.             kick(addr);
  174.             break;
  175.         }
  176.         free_p(bp);
  177.     }
  178. }
  179. /* Check remote password */
  180. static int
  181. chkrpass(bp)
  182. struct mbuf *bp;
  183. {
  184.     char *lbuf;
  185.     int16 len;
  186.     int rval = 0;
  187.  
  188.     len = len_mbuf(bp);
  189.     if(strlen(Rempass) != len)
  190.         return rval;
  191.     lbuf = malloc(len);
  192.     pullup(&bp,lbuf,len);
  193.     if(strncmp(Rempass,lbuf,len) == 0)
  194.         rval = 1;
  195.     free(lbuf);
  196.     return rval;
  197. }
  198. rem0()
  199. {
  200.     if(Rem != -1){
  201.         close_s(Rem);
  202.         Rem = -1;
  203.     }
  204. }
  205.  
  206.